Stata:如何撰写具有自动更新功能的Stata命令-updatecmd
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会:因果推断专题
作者:杜克锐
目录
1. 设计思路
2. 具体示例
3. 相关推文
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
1. 设计思路
前段时间发现 Gitee.com 的网页源代码更改了,导致原来写的用于安装的 gitee
命令 (用于安装 gitee 上的程序包) 无法使用。因此,不得不修改一下 gitee
命令,然后再发给 Baum 更新到 ssc
上。
但考虑到 Gitee.com 可能以后还会更改网页源代码,gitee
命令也得做相应更新。索性就在 gitee
命令中加入一段代码,用于检测是否有新版本的程序,并自动更新。代码原理很简单,就是对比一下电脑本地的 gitee.ado
的版本号与服务器上的版本号,如果本地命令版本号低于线上版本就重新安装 gitee
进行更新。
完成这项工作后,觉得有必要把自动更新程序提取出来写一个独立的命令,嵌入我的其他命令,以方便用户进行相关命令的更新,并及时修正命令存在的 bugs。
于是我开始更进一步的思考。gitee
命令做的是简单的爬虫工作,本身就是需要跟网络进行连接,并获取正确的内容。如果 Gitee.com 更改网页源代码,gitee
命令也得做对应的修改,要不用户无法使用。所以对于 gitee
命令强制更新似乎是可以接受的。
但对于其他命令,强制更新会更改用户电脑上的文件,显然不太合适,这应该由用户自己决定。所以在检查到新命令的时候,应该告知用户有新版本的命令,让用户选择是否更新。这就涉及到一个 Stata 与用户进行交互的问题。利用 Stata 的 Dialog programming,我设计了一个简单的弹窗。一旦检测到有新版本的命令,Stata 会弹出如下窗口,用户需要在 Yes 前面打钩 ✔,点 Next 进入更新;否则跳过更新。
更进一步地,我希望加入更新代码后对用户的干扰越小越好。如果没有检测到新版本,命令执行原来的功能,用户不会感知到检测更新的存在。如果存在新版本,用户可以选择更新或者不更新,然后程序继续执行原来的功能。要实现这目标,那么程序就需要进行递归。我用如下简单的流程图来说明:
另外一个问题是 Stata 用户可能在工作中会多次地使用一个命令,让命令每次调用都进行检测更新没有必要,也浪费时间和资源。对此,我可以用一个 global
来记录更新检测的状态,如果是已经检测过更新,那么后续用户再使用命令的时候就会跳过检测更新,执行原有的命令。最后,我将这一更新方法写成了新的命令 updatecmd
和 updatecmd2
,可以作为 routine 用于嵌入用户的开发命令中,实现自动更新。
2. 具体示例
接下来,我将以下面例子进行说明。demo_updatecmd
命令是个 demo,其功能只是在 Stata 控制台显示 "hello, your code written here"。
*! version 0.02
cap program drop demo_updatecmd
program define demo_updatecmd
version 16
di "hello, your code written here"
end
为了使得这个命令可以自动更新,需要在 di "hello, your code written here"
上面加入以下代码。其中,
第 7-8 行, local pkg
和local cmdname
分别放入命令所属的程序包名称和命令本身名称;第 9-10 行提供程序的安装源。 global c_m_d_0
存入命令行所输入的内容;第 11-18 行在线安装 updatecmd
程序包;第 24 行用 ${up_grade_`pkg'}
判断是否已经检测过更新,如果没有检测过,则进入检测更新环节;第 26 行是核心,调用 updatecmd
进行检测更新,from()
和froma()
提供了两个线上程序下载源。如果从from()
检测程序失败,则进一步使用froma( )
的程序源。这里主要考虑到国内用户可能上不了 github,而国外用户可能用不了 gitee;第 29 行之后则可以写原有命令的内容。Stata 命令开发者只需第 6-29 行放入自己的命令中,并更替第 7-10 行的参数后,并可实现使用这个自动更新 routine。
*! version 0.02
cap program drop demo_updatecmd
program define demo_updatecmd
version 16
**********************************************
*** 需要更改的内容
local pkg updatecmd // updatecmd should be replaced with your package name
local cmdname updatecmd //当前的命令名称
local from "https://gitee.com/kerrydu/kgitee/raw/master/"
local froma "https://github.com/kerrydu/kgitee/raw/master/" //可缺省
*******Check whether a new version is available
global c_m_d_0 `0'
//install the updatecmd package if it is missing
cap which updatecmd
if _rc{
cap net install updatecmd, from("https://github.com/kerrydu/kgitee/raw/master/") replace
if _rc{
cap net install updatecmd, from("https://gitee.com/kerrydu/kgitee/raw/master/") replace
if _rc global up_grade_`pkg' "updatecmd_is_missing"
}
}
//the first run of the command defines global up_grade_`pkg'
local checkcmd 0
if "${up_grade_`pkg'}"==""{
local checkcmd 1
updatecmd `cmdname', from(`from') froma(`froma') pkg(`pkg')
}
if `checkcmd' exit
********************************************
di "hello, your code written here" // the content of your command placed here
end
需要特别说明的是,命令更新的判断依据是 ado 文件中的命令版本号。为了正确提取版本号,我在 updatecmd
中做了一些约定,只有 version #.####
这样的版本号才能被 updatecmd
识别出来。因此,使用 updatecmd
进行自动更新,建议在 ado 文件的首行,写入这样的版本信息 !* version #, date
。
其中,#
必须为一个实数,不能出现字母,也不能是 #.#.#.#
的形式。在与连老师进行交流后,我又增加了 updatecmd2
命令,可以用于版本号为 #.#.#.#
的形式。提取到错误版本号可能造成一些未知的错误,为了谨慎起见,我仍排除了版本号中有字母的形式。例如 1.223a
是不能被 updatecmd
和 updatecmd2
所识别。
最后,局限个人的能力和时间,我这里只是探索性地提供一个思路来实现 Stata 命令的自动更新,还存在大量的问题没有解决。例如,弹窗还比较简陋,缺少版本号信息和版本更新的功能说明。感兴趣的朋友可以自行探索。相关程序代码在 kgitee: install Stata package issued by Kerry Du in Gitee.com。这是个简单的想法,欢迎大家提供改进意见。
3. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 编程 程序, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:计量专题 Stata:事件研究法的编程实现 专题:Stata教程 Stata编程:暂元,local!暂元,local! 普林斯顿Stata教程(三) - Stata编程 专题:Stata命令 moremata程序包手动安装方法 专题:Stata程序 Stata小白编程:暂元及macrolists命令 Stata小白编程:步步为营-以阶乘计算为例 Stata程序:最大公约数和最小公倍数 Stata程序:10 分钟快乐编写 ado 文件 Stata程序:Monte-Carlo-模拟之产生符合特定分布的随机数 Stata程序:我的程序多久能跑完? Stata程序:暂元-(local)-和全局暂元-(global) Stata程序:切割文件路径和文件名 Stata程序:是否有类似-Python-中的-zip()-函数 Stata程序:在我的程序中接纳另一个程序的所有选项 Stata 程序:数值求解极值的基本思想
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。